/**
 * @brief 异步通讯事件框架，目标是实现一个通用的异步通讯的事件驱动框架。在linux下使用
 *   epoll，在windows下使用iocp。使用这个框架用来支持基础的通讯。计划支持串口，GPIO，
 *   RAW SOCKET ， TCP， UDP，MQTT ，文件
 * @version 1.0
 * @author 宋炜
 * @date 2023-08-25
 */

#pragma once

#include <type_traits>
#include <memory>

#include "itfc.hpp"
#if defined( __LINUX__ )
#    include "linux.hpp"
#elif defined( WIN32 ) || defined( WINNT )
#    include "win.hpp"
#endif

namespace wheels{ namespace mandarava {

template< typename T >
class mandarava : public mandaravaItfc
{
private:
	using midType__ = typename std::decay< T > :: type;
public:
	using imp_type = typename std::remove_pointer< midType__ >::type;

	static_assert( std::is_base_of< mandaravaItfc , imp_type >::value , "" );
private:
	std::shared_ptr< imp_type >    pt_imp__;
public:
	/**
	 * @brief
	 * @param maxEvt[ I ]，在windows下是最大线程数，在linux下再大事件数量
	 */
	mandarava( int maxEvt );
	virtual ~mandarava();

	virtual bool addChannel( dataCh * ch ) final;
	/**
	 * @brief 删除通道
	 */
	virtual bool eraseChannel( dataCh * ch ) final;
	/**
	 * @brief 启动运行或者停止运行
	 * @param sw[ I ], 开关
	 * @param overtime[ I ], 等候超时时间
	 */
	virtual void run( bool sw , long overtime = 200 ) final;
};

}}
